package PEARWARE.automataEsclavo2.impl;

import java.net.MalformedURLException;
import java.rmi.RemoteException;
import PEARWARE.comunicacion.mensajes.*;
import PEARWARE.comunicacion.*;

/**
 * Clase de estado. Representa el estado del automata cuando la cinta esta
 * parada.
 * 
 * @author Ricardo Vilchez Garcia.
 * @date 10/06/2012
 * 
 */

public class EstadoParado extends IEstado implements MensajeVisitor {
	private boolean _terminado;

	/**
	 * Constructor publico de la clase
	 */
	public EstadoParado() {
		System.out.println("PARADO");
		Elementos.getElementos().setResumen("PARADO");
		_terminado = false;
		// Elementos.getElementos().reiniciar();
		Elementos.getElementos().getCintaTransferencia().pararCinta();
	}

	/**
	 * Ejecucion principal del estado
	 */
	public void ejecutarAccion() {
		// Obtener mensajes y ejecutar acciones oportunas en los visit.
		Mensaje mensaje;
		while ((mensaje = Elementos.getElementos().get_buzonesMaestro()
				.recibirMensaje()) != null) {
			try {
				mensaje.accept(this);
				Elementos.getElementos().setMensajeRecibido(true);
			} catch (RemoteException e) {
				Elementos.getElementos().setResumen("Intentando reconectar");
				try {
					Elementos.getElementos().conectar();
				} catch (RemoteException ee) {
				} catch (MalformedURLException ee) {
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			}
		}

		// Ejecutar la accion del estado.
		// Este no hace nada.

		if (!Elementos.getElementos().isEmergencia()) {
			if (Elementos.getElementos().isParada()) {
				boolean piezaFinal = Elementos.getElementos()
						.getCintaTransferencia().hayPiezaFinal();
				if (piezaFinal) {
					_terminado = true;
				} else {
					iteracionCinta(piezaFinal, Elementos.getElementos()
							.isEmergencia());
				}
			}
		}

		// Enviar estado del automata.
		MensajeEstadoAutomataEsclavo2 estado = new MensajeEstadoAutomataEsclavo2(
				Elementos.getElementos().getCintaTransferencia().isMoving(),
				Elementos.getElementos().getCintaTransferencia().getVelocidad(),
				Elementos.getElementos().getCintaTransferencia().isLlena(),
				Elementos.getElementos().getCintaTransferencia()
						.hayPiezaFinal(), Elementos.getElementos()
						.getCintaTransferencia().getPosiciones(), Elementos
						.getElementos().getEstacionSoldadura().isActivo(),
				Elementos.getElementos().getEstacionSoldadura()
						.get_sensorPresencia().getActivo(), Elementos
						.getElementos().getResumen());

		Elementos.getElementos().get_buzonesMaestro().enviarMensaje(estado);
	}

	/**
	 * Reliza el proceso de transicion del diagrama de estadps dependiendo de si
	 * el estado ha terminado su ejecucion
	 */
	public IEstado ejecutarTransicion() {
		if (Elementos.getElementos().isRecoveryMode()) {
			System.out.println("RECUPERADO DE: "
					+ Elementos.getElementos().getEstadoBackup().printEstado());
			return Elementos.getElementos().getEstadoBackup();
		}
		if (_terminado == true) {
			return new EstadoCintaMoviendose();
		} else {
			Elementos.getElementos().setResumen("PARADO");
			return this;
		}
	}

	/**
	 * Visit del mensaje MensajeArranqueMaestro
	 */
	public void visit(MensajeArranqueMaestro m) {
		System.out.println("RECIBIDA ORDEN DE ARRANQUE");
		Elementos.getElementos().get_buzonesMaestro().flushBuzon();
		_terminado = true;
		if (Elementos.getElementos().isEmergencia()) {
			Elementos.getElementos().setRecoveryMode(true);
			Elementos.getElementos().setEmergencia(false);
		}
		if (Elementos.getElementos().isCaida()) {
			Elementos.getElementos().get_buzonesMaestro().flushBuzon();
		}
		Elementos.getElementos().setCaida(false);
		Elementos.getElementos().setParada(false);
		Elementos.getElementos().setResumen("RECIBIDA ORDEN ARRANQUE");
		Elementos.getElementos().setEmergencia(false);
	}

	/**
	 * Visit del mensaje MensajeParadaMaestro
	 */
	public void visit(MensajeParadaMaestro m) {
		System.out.println("RECIBIDA ORDEN DE PARADA");
		_terminado = false;
		Elementos.getElementos().setParada(true);
		Elementos.getElementos().setEmergencia(m.isEmergencia());
		if (m.getCaido() != -1) {
			Elementos.getElementos().setCaida(true);
			System.exit(0);
		}
		Elementos.getElementos().setResumen("RECIBIDA ORDEN PARADA");
	}

}
